package com.atguigu.gulimall.product.service.impl;

import com.atguigu.gulimall.product.entity.Category;
import com.atguigu.gulimall.product.dao.CategoryMapper;
import com.atguigu.gulimall.product.service.CategoryBrandRelationService;
import com.atguigu.gulimall.product.service.ICategoryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 商品三级分类 服务实现类
 * </p>
 *
 * @author szh
 * @since 2020-12-16
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements ICategoryService {
	@Autowired
	private CategoryBrandRelationService categoryBrandRelationService;

	@Override
	public List<Category> listWithTree() {
		// 1- 查询所有分类
		List<Category> categoryList = baseMapper.selectList(null);

		//2- 将树形菜单进行组装
		// 2.1 -查询一级分类
		List<Category> levelOneMenus = categoryList.stream().filter(category -> category.getParentCid() == 0).map((menu) -> {
			menu.setChildren(getChildrens(menu, categoryList));
			return menu;
		}).sorted((menu1, menu2) -> {
			// 这里可以使用Apache 排序工具类

			return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());
		})
				.collect(Collectors.toList());
		System.out.println(levelOneMenus);
		return categoryList;
	}

	@Override
	public int removeMenuByIds(List<Long> ids) {
		// todo 需要检查当前节点是否有子节点，如果有子节点，就不删除
		int delFlag = baseMapper.deleteBatchIds(ids);
		return delFlag;
	}

	@Override
	public Long[] findCatelogPath(Long catelogId) {
		ArrayList<Long> paths = new ArrayList<>();
		List<Long> parentPath = findParentPath(catelogId, paths);
		//  逆序一下
		Collections.reverse(parentPath);
		return parentPath.toArray(new Long[parentPath.size()]);
	}


	@Override
	@Transactional
	public Boolean updateCascade(Category category) {
		boolean updateFlag = this.updateById(category);
		if (StringUtils.isNotBlank(category.getName())) {
			Boolean flag = categoryBrandRelationService.updateCategoryName(category.getCatId(), category.getName());
			return updateFlag & flag;
		}
		return updateFlag;
	}

	/**
	 * 功能：递归  查找某分类下的 菜单路径
	 *
	 * @param catelogId 当前分类的主键id
	 * @param paths     当前分类的菜单路径
	 * @return 逆序的list
	 */
	private List<Long> findParentPath(Long catelogId, List<Long> paths) {
		// 收集当前节点id
		paths.add(catelogId);
		Category byId = this.getById(catelogId);
		if (byId == null) {
			return new ArrayList<>();
		} else {
			if (byId.getParentCid() != 0) {
				findParentPath(byId.getParentCid(), paths);
			}
			return paths;
		}

	}

	/**
	 * 功能：得到某一菜单下的子菜单（注意是所有子菜单,而不是直接下级）
	 * 采用的是递归写法。
	 *
	 * @param root 当前菜单
	 * @param all  所有集合
	 */
	private List<Category> getChildrens(Category root, List<Category> all) {

		List<Category> children = all.stream().filter(category -> {
					return category.getParentCid().equals(root.getCatId());
				}
		).map(category -> {
			//1, 找到子菜单.注意这里用到了递归
			category.setChildren(getChildrens(category, all));
			return category;
		}).sorted((menu1, menu2) -> {
			// 排序（注意这里很可能为空）
			return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());
		}).collect(Collectors.toList());


		return children;
	}
}
